谈电子邮件和即时通讯
=====================

- 作者：`vimacs <https://vimacs.lcpu.club>`__
- 日期：2018.07.19
- 本作品采用 `知识共享署名 4.0 国际许可协议 <https://creativecommons.org/licenses/by/4.0/>`__ 进行许可。


即时通讯（IM）到底能不能取代电子邮件？这是个很有意思的问题，已经讨论了很长的时间，但是也没有结果。在这篇文章中，我来谈谈我的看法。


电子邮件和IM的架构
-------------------

邮件通过SMTP协议传到发送方的服务器，之后发送方服务器把邮件发送至接收方服务器，接收方从服务器上用IMAP协议取回邮件。

电子邮件是去中心化的，用户可以选择不同的服务器，而且不同服务器的用户之间可以通信。这种协议被成为联邦式（federated）协议。

一般人谈IM的时候，认为IM是中心化的，典型的例子有QQ、MSN、微信、Telegram、WhatsApp等等，但是除了这些之外，还有去中心化的IM.

去中心化的IM可以分为3种。

一种是类似IRC、Rocket Chat、MatterMost这类自托管服务，服务可以运行在不同的服务器上，用户可以用一个服务器上的服务，但是不同服务器间的用户不能直接通信。这类服务相对中心化服务的优点是数据和用户信息可以存放在一个用户选择的服务器上，避免大企业或监控部门窥探用户隐私，适合企业使用。

一种是和邮件类似的联邦式服务，XMPP和Matrix都是联邦式的IM协议，比较接近现代IM的特点。

还有一种是P2P的服务，如Tox和GNU Ring.P2P的服务虽然也有服务器，但它们是只用于帮助用户发现其他用户。一旦用户找到通信的另一方，通信数据直接在通信双方之间传送，不经过服务器。


邮件列表和群聊
~~~~~~~~~~~~~~~~

之前提到的用法都是一对一的通信，没有提到群聊的问题。这里简单地谈谈电子邮件和IM的群聊的特点。

电子邮件的群聊最为灵活，用户可以指定多个收件人，还可以指定Reply-to字段让接收方回复到特定地址，指定CC和BCC字段设置抄送。特别的，BCC字段可以对接收方隐藏发送方的其他收件人，当然，这个前提是服务器不泄漏相关信息。通过在邮件中指定多个收件人，可以实现邮件的群聊，而且这个群聊没有中心服务器，和Matrix的聊天室是一样的。

电子邮件实现群聊的另一方式是邮件列表，邮件列表有中心服务器。邮件列表的使用方式和论坛类似，邮件列表有一个地址，用户把邮件发送到邮件列表的地址，之后订阅了邮件列表的用户会收到列表中的新邮件。在邮件列表中回复邮件，相当于论坛里面的回帖操作。从架构上看，邮件列表和XMPP的MUC比较相似，聊天室在一个中心服务器上，这个服务器负责了所有消息的转发。

而IM群聊的架构基本上就分为以上两类。联邦式IM的聊天室——Matrix聊天室和XMPP MUC，在上文已经提及。中心化IM的聊天室显然也在中心服务器上，而P2P的IM协议的群聊则是完全地去中心化。


消息存储
~~~~~~~~~

电子邮件的协议让邮件服务器存储所有的消息，除非用户删除或数据量超过了限制，这确保了用户可以随时收到消息。

早期的IM并不存储消息。从即时通信的使用场景看，大多数消息也不需要长期存储。但是现代IM都有消息存储的特性。

Matrix协议的设计是让服务器长期存储消息，让用户可以获取甚至搜索历史消息，在多设备的情形下可以让所有设备都看到历史记录（甚至是已加密的历史记录）。而XMPP的消息存档（Message Archive Management, MAM）可以让服务器存放一定量的消息，但不是长期存储，主要还是用于少量的离线消息和应对网络不稳定的情况。

至于P2P的IM协议，由于无服务器，存储消息比较困难，而且离线消息也不易实现。


端到端加密
~~~~~~~~~~~

由于用户越来越重视隐私，端到端加密是现代IM重点宣传的特性之一。

电子邮件的主要的端到端加密方式是OpenPGP，它已经用了很多年，现在仍然流行。OpenPGP使用公钥加密和对称密码确保数据的保密性，用数字签名确保数据的完整性和发送方验证，数字签名具有不可否认性。

由于OpenPGP的公钥加密中，每次加密的加密密钥都是收件人的公钥，一旦对应的私钥泄漏或被破解，则所有用该密钥加密的消息都会被解密。因此，也有黑客做有前向安全（forward secrecy）的邮件加密方案。 `opmsg <https://github.com/stealth/opmsg>`__ 和短信应用 `silence <https://silence.im/>`__ 是具有前向安全的邮件或类似通信方式的加密方案。

即时通信的端到端加密经过了几代发展。最早的OTR使用密钥交换实现前向安全和未来安全（future secrecy），同时OTR提出IM的端到端加密应当在保证完整性的同时做到可否认，因此使用基于对称密码的消息验证码（Message Authentication Code, MAC），而不是数字签名，来实现完整性。而SCIMP使用基于散列迭代的方式产生加密密钥实现前向安全。Open Whisper Systems 将两种密钥产生方式结合，创造了 Double Ratchet 算法。现代的端到端加密算法大多基于 Double Ratchet 算法。而端到端加密的可否认性从OTR单纯使用对称密钥，到Open Whisper Systems的3DH，再到OTRv4的DAKE，在不断地改进。


电子邮件和IM的用户接口
-----------------------

电子邮件的一般用法是，用户填写收件方地址、主题和内容，然后发送。电子邮件的用法比IM要灵活很多：

* 电子邮件可以按主题分类管理。当然了，IM也可以，但是需要根据不同主题创建多个聊天室。
* 如果是讨论一个领域下的多个主题，那么邮件列表很方便，IM则无法应对一个群体讨论中不断有不同的人发起新主题的情况。邮件列表的消息归档更是IM很难做到的。
* 电子邮件可以很方便地指定多个收件人进行群发，可以选择性地让收件人看到这封邮件的一部分收件人。这点IM做不到，同时开多个私聊的话，每个接收方都只能看到发送方；群聊的话，所有人都能看到参与讨论的所有人，并且回复消息也是对群里所有人，而不能只回复给部分人。

但是电子邮件的灵活性，也使得操作更为复杂，对于简短的消息，IM的发送比电子邮件要快。

有的邮件客户端，如 `Delta Chat <https://delta.chat/>`__ 通过设计一个用户界面，使得电子邮件拥有类似IM的操作方式，并且让用户不必为了有IM的体验而申请一个IM的帐号。


其他
----

从使用习惯上来看，虽然电子邮件和IM都能发送各种长度的消息，但是短消息通常使用IM，长消息或者不需要得到立即回复的消息通常使用邮件，并且邮件的写法比较正式。

大多数即时通讯服务有联系人/好友系统，通过认证才能发送消息，这在一定程度上避免了垃圾邮件的问题。


使用建议
--------

由于电子邮件的灵活性，我认为IM还不能取代电子邮件。同时，由于目前电子邮件服务的普遍部署，用户通常使用中心化的IM服务，在正式的工作中，用电子邮件也更合适。而IM的操作更加简洁，它很适合简短的交流，它可以作为电子邮件的一个很好的补充。

对于IM服务的选择，我选择联邦式的XMPP和Matrix，它们都是开放协议，客户端和服务器都有自由软件实现。Rocket Chat适合于企业内部即时通讯的使用。在公共聊天中，P2P的协议隐私性最好，但是没有消息存储，实用性不太好，可以作为一种联系方式的补充。中心化服务中，Telegram有自由软件客户端，可以使用，但是有被封锁和服务被强制关停的风险。没有自由软件客户端的IM不要使用。

端到端加密功能在现代的通信中越来越重要，无论是使用邮件还是任何一种IM，如果可能的话，在非公开聊天中尽量启用端到端加密。即使不能及时验证密钥和用户身份的对应关系，使用端到端加密也能防止被动监听。
